package com.briup.cms.util;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.po.LikeTable;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.sql.Types;
import java.util.Collections;

/**
 * 代码生成器
 */
public class MybatisPlusGenerator {
    //代码生成器连接的数据库连接信息
    private static String url = "jdbc:mysql://localhost:3306/cms";
    private static String username = "root";
    private static String password = "root";
    //填写具体的项目配置信息
    private static String author = "briup";//作者信息
    private static String parentPackage = "com.briup.cms";//项目公共包名

    public static void main(String[] args) {
        FastAutoGenerator.create(url, username, password)
                .globalConfig(builder -> {//全局配置
                    builder.author(author) // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .disableOpenDir()// 禁止自动打开文件管理目录
                            .commentDate("yyyy/MM/dd HH:mm:ss")//设置注释中日期格式
                            .outputDir("src/main/java"); // 指定输出目录
                })
                //数据表中列的类型转化为指定类型（默认有转化规则）
                .dataSourceConfig(builder ->
                        builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
                            int typeCode = metaInfo.getJdbcType().TYPE_CODE;
                            if (typeCode == Types.SMALLINT) {
                                // 自定义类型转换
                                return DbColumnType.INTEGER;
                            }
                            return typeRegistry.getColumnType(metaInfo);
                        })
                )
                //包配置
                .packageConfig(builder ->
                        builder.parent(parentPackage) // 设置父包名
                                .entity("bean.basic") // 设置 业务实体包名
                                .service("service") // 设置 Service 包名
                                .serviceImpl("service.impl") // 设置 Service Impl 包名
                                .mapper("mapper.basic") // 设置 Mapper 包名
                                .xml("mapper.xml") // 设置 Mapper XML 包名
                                .controller("web.controller") // 设置 Controller 包名
                                .pathInfo(Collections.singletonMap(OutputFile.xml, "src/main/resources/mappers/basic")) // 设置路径配置信息
                                .build()
                )
                //
                .strategyConfig(builder ->{
                    //指定表的生成逻辑
                    builder.likeTable(new LikeTable("cms_"))
                            .addTablePrefix("cms_"); //去掉表的前缀
                            //.addFieldPrefix("a_");//去掉列的前缀
                    //指定生成实体类的规则
                    builder.entityBuilder()
                            .enableFileOverride() //可以覆盖代码
                            .enableLombok()   //开启lombok注解
                            .enableChainModel(); //开启链式调用
                    //指定生成Controller规则
                    builder.controllerBuilder()
                            .enableFileOverride()
                            .enableRestStyle();
                    //指定service生成规则
                    builder.serviceBuilder()
                            .enableFileOverride();
                    //指定mapper生成规则
                    builder.mapperBuilder()
                            .enableFileOverride()
                            .enableBaseColumnList()//生成查询字段
                            .enableBaseResultMap(); //生成基础映射关系
                    }
                )
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .execute();
    }
}
